from scipy.optimize import minimize
from numpy import ones
#题目如下：
#   min (2+x1)/(1+x2) -3*x1 +4*x3
#   s.t.0.1 <= xi <= 0.9,i = 1,2,3
def obj(x): #这里同样需要像matlab里面一样单独定义出来目标函数。此处的obj就是函数名
    x1,x2,x3=x
    return (2+x1)/(1+x2)-3*x1+4*x3
LB=[0.1,0.1,0.1]; UB=[0.9,0.9,0.9]               #定义上界和下界
# bound=tuple(zip(LB, UB))   #这里实质上是用数组的操作减少了手工输入的次数
#本质上范围是依照自变量的顺序进行像这样的输入：
bound = ((0.1, 0.9), (0.1, 0.9), (0.1, 0.9))
#也就是说 bound = ((x1_lb,x1_ub),(x2_lb,x2_ub),(x3_lb,x3_ub))

ini=[0.9,0.9,0.1]#传入初始值

res=minimize(obj,ini,bounds=bound)  #调用函数的基本格式
#同样的，第二个传入参数是初始值。
# 如果直接扔给他ones就是默认用了全1当成初始值。其实可以事先输入进行调控
print(res.fun,'\n',res.success,'\n',res.x)  #输出最优值、求解状态、最优解
